#include <future>
#include <iostream>
#include <thread>

int main()
{
    // 1.来自 packaged_task 的 future
    std::packaged_task<int()> task([](){ return 7; }); // 包装函数
    std::future<int> f1 = task.get_future();  // 获取 future
    std::thread t(std::move(task)); // 在线程上运行

    // 2.来自 async() 的 future
    std::future<int> f2 = std::async(std::launch::async, [](){ return 8; });

    // 3.来自 promise 的 future
    std::promise<int> p;
    std::future<int> f3 = p.get_future();
    std::thread([&p]{ p.set_value_at_thread_exit(9); }).detach();

    std::cout << "等待..." << std::flush;
    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "完成!\n结果为: "
              << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    t.join();

    return 0;
}

/*
等待...完成!
结果为: 7 8 9

 */